#ifndef RESETDIALOG_H
#define RESETDIALOG_H

#include <QDialog>
#include "global.h"
#include <QMap>
#include <future>

//1.输入合法性检测
//2.错误展示
namespace Ui {
class ResetDialog;
}

class ResetDialog : public QDialog
{
    Q_OBJECT

public:

    //假设我现在，不知道：待会来处理这个ID的函数，以及这个函数的参数，返回值等各种信息
    using FuncType=std::function<void(const QJsonObject&)>;


    explicit ResetDialog(QWidget *parent = nullptr);
    ~ResetDialog();

private slots:
    void on_return_button_clicked();

    void on_confirm_button_clicked();

private:


    QMap<ReqId,FuncType> reqID_Map_function;
    QMap<ReqId,std::function<void()>> reqID_Map_function_1;

    //返回值一致，参数一致，可以使用容器存储函数对象，等到要用的时候在使用
    //如果使用了模板，就要从编译期和运行期风别去思考问题，编译期会生成什么样的代码，这些代码会在运行期造成什么影响
    //这个接口，接受一个确定类型的可调用对象，编译期时转化为一个void()的可调用对象，生成的代码，会在运行期把传过来的
    //参数绑定，从而生成一个void()的函数对象，并且保存下来，最终通过map进行调用
    void pushFuncMap(ReqId id,std::function<void(const QJsonObject&)> fun,const QJsonObject& Qjson);


    //使用姆阿布纳，那就有编译期的事，编译期接受一个f,生成模板，该模板的运行期职责是，将你的f转换成，然后存放
    template<typename F,typename... Args>
    void pushFunction(ReqId id,F&& f,Args... args)
    {
        //绑定所有的参数
        auto ff=std::bind(std::forward<F>(f),std::forward<Args>(args)...);
        //存储函数对象
        reqID_Map_function_1.insert(id,ff);
    }


    //不同的ID会对应不同的回调函数，甚至他们的返回值，参数类型都是不一样的，那有没有办法统一存储他们，存成一致的类型
    //1.同步调用：抽象一层中间层，保证外层参数一致，这样就可以存储，内部则调用具体的逻辑，这样就可以等参数来着之后，同步调用
    //2.异步调用：在刚刚外层，参数来了之后，binding进去，所哟参数都固定住，就可以使用void()进行可调用对象存储

    //同步调用：抽象一层
    //异步调用：把所有参数全都固定住变更成void()存储
    //lambda语法和bind语法，都是函数适配器，使用一个新的外层函数包装已有的函数，变成可调用对象



signals:
    void switchlogin();

private:
    Ui::ResetDialog *ui;
    QMap<TipErr,QString> _err_map;          //根据错误类型寻找对应的信息进行展示，其实只要是一个容器就行，但是就是简单一些

private:

    //错误检查
    bool checkUserValid();      //检查用户
    bool checkEmailValid();     //邮箱
    bool checkPassValid();      //新密码
    bool checkConfirmValid();   //检查是否密码一致
    bool checkVarifyValid();    //检查是否验证码一致，连接到redis确认
    void AddErr(TipErr tip,QString str);              //加入错误信息
    void DelErr(TipErr tip);              //移除错误信息

    bool checkAllVaild();               //不要异步调用，这是同步调用获得结果之后，才可以发送信号到后端的，否则是不可以发送的

    void ShowTips(QString str,bool flag);           //根据状态设置当前字体的颜色，这是QSS样式的一种
public slots:
    void slot_reset_mod_finish(ReqId id, QString res, ErrorCodes err);


public:




};

#endif // RESETDIALOG_H
